/* 角度：归一化，PI*2 和 PI/2 的常量值 */

// MARK: 常量 -------------------------------------------------------------------------------------

export const TAU = Math.PI * 2
export const HALF_PI = Math.PI / 2

// MARK: 转换 -------------------------------------------------------------------------------------

// 角度转弧度
const DEG2RAD = Math.PI / 180
export function degToRad(deg: number) {
  return deg * DEG2RAD
}
// 角度转弧度
const RAD2DEG = 180 / Math.PI
export function radToDeg(rad: number) {
  return rad * RAD2DEG
}

// MARK: 归一化 -----------------------------------------------------------------------------------

//【角度】

// 归一化一个角度到 [0, 180) 之间
export function norm_0_180(delta: number) {
  while (delta >= 180) delta -= 180
  while (delta < 0) delta += 180
  return delta
}

// 归一化一个角度到 [0, 360) 之间
export function norm_0_360(delta: number) {
  while (delta >= 360) delta -= 360
  while (delta < 0) delta += 360
  return delta
}

// 归一化一个角度到 [-90, 90) 之间
export function norm_90_90(delta: number) {
  while (delta >= 90) delta -= 180
  while (delta < -90) delta += 180
  return delta
}

// 归一化一个角度到 [-180, 180) 之间
export function norm_180_180(delta: number) {
  while (delta >= 180) delta -= 360
  while (delta < -180) delta += 360
  return delta
}

//【弧度】

// 归一化一个角度到 [0, PI) 之间
export function norm_0_PI(delta: number) {
  while (delta >= Math.PI) delta -= Math.PI
  while (delta < 0) delta += Math.PI
  return delta
}

// 归一化一个角度到 [0, 2PI) 之间
export function norm_0_2PI(delta: number) {
  while (delta >= TAU) delta -= TAU
  while (delta < 0) delta += TAU
  return delta
}

// 归一化一个角度到 [-90, 90) 之间
export function norm_HPI_HPI(delta: number) {
  while (delta >= HALF_PI) delta -= Math.PI
  while (delta < -HALF_PI) delta += Math.PI
  return delta
}

// 归一化一个角度到 [-180, 180) 之间
export function norm_PI_PI(delta: number) {
  while (delta >= Math.PI) delta -= TAU
  while (delta < -Math.PI) delta += TAU
  return delta
}

// MARK: 导出 -------------------------------------------------------------------------------------

export const angle = {
  TAU,
  HALF_PI,
  degToRad,
  radToDeg,
  norm_0_180,
  norm_0_360,
  norm_90_90,
  norm_180_180,
  norm_0_PI,
  norm_0_2PI,
  norm_HPI_HPI,
  norm_PI_PI,
}
